home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / hplip / fax / pmlfax.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  24.0 KB  |  852 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import sys
  5. import os
  6. import os.path as os
  7. import struct
  8. import time
  9. import threading
  10. from base.g import *
  11. from base.codes import *
  12. from base import device, utils, pml, codes
  13. from prnt import cups
  14. from fax import *
  15. PAGE_FLAG_NONE = 0
  16. PAGE_FLAG_NEW_PAGE = 1
  17. PAGE_FLAG_END_PAGE = 2
  18. PAGE_FLAG_NEW_DOC = 4
  19. PAGE_FLAG_END_DOC = 8
  20. PAGE_FLAG_END_STREAM = 16
  21. MAJOR_VER = 2
  22. MINOR_VER = 0
  23. MFPDTF_RASTER_BITMAP = 0
  24. MFPDTF_RASTER_GRAYMAP = 1
  25. MFPDTF_RASTER_MH = 2
  26. MFPDTF_RASTER_MR = 3
  27. MFPDTF_RASTER_MMR = 4
  28. MFPDTF_RASTER_RGB = 5
  29. MFPDTF_RASTER_YCC411 = 6
  30. MFPDTF_RASTER_JPEG = 7
  31. MFPDTF_RASTER_PCL = 8
  32. MFPDTF_RASTER_NOT = 9
  33. DT_UNKNOWN = 0
  34. DT_FAX_IMAGES = 1
  35. DT_SCANNED_IMAGES = 2
  36. DT_DIAL_STRINGS = 3
  37. DT_DEMO_PAGES = 4
  38. DT_SPEED_DIALS = 5
  39. DT_FAX_LOGS = 6
  40. DT_CFG_PARMS = 7
  41. DT_LANG_STRS = 8
  42. DT_JUNK_FAX_CSIDS = 9
  43. DT_REPORT_STRS = 10
  44. DT_FONTS = 11
  45. DT_TTI_BITMAP = 12
  46. DT_COUNTERS = 13
  47. DT_DEF_PARMS = 14
  48. DT_SCAN_OPTIONS = 15
  49. DT_FW_JOB_TABLE = 17
  50. RT_START_PAGE = 0
  51. RT_RASTER = 1
  52. RT_END_PAGE = 2
  53. FIXED_HEADER_SIZE = 8
  54. IMAGE_VARIANT_HEADER_SIZE = 10
  55. DIAL_STRINGS_VARIANT_HEADER_SIZE = 6
  56. FAX_IMAGE_VARIANT_HEADER_SIZE = 74
  57. SOP_RECORD_SIZE = 36
  58. RASTER_RECORD_SIZE = 4
  59. EOP_RECORD_SIZE = 12
  60. DIAL_STRING_RECORD_SIZE = 51
  61. PAGE_FLAG_NEW_PAGE = 1
  62. PAGE_FLAG_END_PAGE = 2
  63. PAGE_FLAG_NEW_DOC = 4
  64. PAGE_FLAG_END_DOC = 8
  65. PAGE_FLAG_END_STREAM = 16
  66. SRC_UNKNOWN = 0
  67. SRC_HOST = 2
  68. SRC_SCANNER = 5
  69. SRC_HOST_THEN_SCANNER = 6
  70. SRC_SCANNER_THEN_HOST = 7
  71. TTI_NONE = 0
  72. TTI_PREPENDED_TO_IMAGE = 1
  73. TTI_OVERLAYED_ON_IMAGE = 2
  74. RASTER_DATA_SIZE = 504
  75.  
  76. class PMLFaxDevice(FaxDevice):
  77.     
  78.     def __init__(self, device_uri = None, printer_name = None, callback = None, fax_type = FAX_TYPE_NONE, disable_dbus = False):
  79.         FaxDevice.__init__(self, device_uri, printer_name, callback, fax_type, disable_dbus)
  80.         self.send_fax_thread = None
  81.         self.upload_log_thread = None
  82.  
  83.     
  84.     def setPhoneNum(self, num):
  85.         return self.setPML(pml.OID_FAX_LOCAL_PHONE_NUM, str(num))
  86.  
  87.     
  88.     def getPhoneNum(self):
  89.         return utils.printable(str(self.getPML(pml.OID_FAX_LOCAL_PHONE_NUM)[1]))
  90.  
  91.     phone_num = property(getPhoneNum, setPhoneNum, doc = 'OID_FAX_LOCAL_PHONE_NUM')
  92.     
  93.     def setStationName(self, name):
  94.         return self.setPML(pml.OID_FAX_STATION_NAME, str(name))
  95.  
  96.     
  97.     def getStationName(self):
  98.         return utils.printable(str(self.getPML(pml.OID_FAX_STATION_NAME)[1]))
  99.  
  100.     station_name = property(getStationName, setStationName, doc = 'OID_FAX_STATION_NAME')
  101.     
  102.     def setDateAndTime(self):
  103.         t = time.localtime()
  104.         p = struct.pack('BBBBBBB', t[0] - 2000, t[1], t[2], t[6] + 1, t[3], t[4], t[5])
  105.         log.debug(repr(p))
  106.         return self.setPML(pml.OID_DATE_AND_TIME, p)
  107.  
  108.     
  109.     def uploadLog(self):
  110.         if not self.isUloadLogActive():
  111.             self.upload_log_thread = UploadLogThread(self)
  112.             self.upload_log_thread.start()
  113.             return True
  114.         return False
  115.  
  116.     
  117.     def isUploadLogActive(self):
  118.         if self.upload_log_thread is not None:
  119.             return self.upload_log_thread.isAlive()
  120.         return False
  121.  
  122.     
  123.     def waitForUploadLogThread(self):
  124.         if self.upload_log_thread is not None and self.upload_log_thread.isAlive():
  125.             self.upload_log_thread.join()
  126.         
  127.  
  128.     
  129.     def sendFaxes(self, phone_num_list, fax_file_list, cover_message = '', cover_re = '', cover_func = None, preserve_formatting = False, printer_name = '', update_queue = None, event_queue = None):
  130.         if not self.isSendFaxActive():
  131.             self.send_fax_thread = PMLFaxSendThread(self, self.service, phone_num_list, fax_file_list, cover_message, cover_re, cover_func, preserve_formatting, printer_name, update_queue, event_queue)
  132.             self.send_fax_thread.start()
  133.             return True
  134.         return False
  135.  
  136.  
  137.  
  138. class PMLUploadLogThread(threading.Thread):
  139.     
  140.     def __init__(self, dev):
  141.         threading.Thread.__init__(self)
  142.         self.dev = dev
  143.  
  144.     
  145.     def run(self):
  146.         STATE_DONE = 0
  147.         STATE_ABORT = 10
  148.         STATE_SUCCESS = 20
  149.         STATE_BUSY = 25
  150.         STATE_DEVICE_OPEN = 28
  151.         STATE_CHECK_IDLE = 30
  152.         STATE_REQUEST_START = 40
  153.         STATE_WAIT_FOR_ACTIVE = 50
  154.         STATE_UPLOAD_DATA = 60
  155.         STATE_DEVICE_CLOSE = 70
  156.         state = STATE_CHECK_IDLE
  157.         while state != STATE_DONE:
  158.             if state == STATE_ABORT:
  159.                 continue
  160.             if state == STATE_SUCCESS:
  161.                 continue
  162.             if state == STATE_BUSY:
  163.                 continue
  164.             if state == STATE_DEVICE_OPEN:
  165.                 state = STATE_REQUEST_START
  166.                 
  167.                 try:
  168.                     self.dev.open()
  169.                 except Error:
  170.                     e = None
  171.                     log.error('Unable to open device (%s).' % e.msg)
  172.                     state = STATE_ERROR
  173.  
  174.                 
  175.                 try:
  176.                     dev.setPML(pml.OID_UPLOAD_TIMEOUT, pml.DEFAULT_UPLOAD_TIMEOUT)
  177.                 except Error:
  178.                     state = STATE_ERROR
  179.                 except:
  180.                     None<EXCEPTION MATCH>Error
  181.                 
  182.  
  183.             None<EXCEPTION MATCH>Error
  184.             if state == STATE_CHECK_IDLE:
  185.                 state = STATE_REQUEST_START
  186.                 ul_state = self.getCfgUploadState()
  187.                 if ul_state != pml.UPDN_STATE_IDLE:
  188.                     state = STATE_BUSY
  189.                 
  190.             ul_state != pml.UPDN_STATE_IDLE
  191.             if state == STATE_REQUEST_START:
  192.                 state = STATE_WAIT_FOR_ACTIVE
  193.                 self.dev.setPML(pml.OID_FAX_CFG_UPLOAD_DATA_TYPE, pml.FAX_CFG_UPLOAD_DATA_TYPE_FAXLOGS)
  194.                 self.dev.setPML(pml.OID_DEVICE_CFG_UPLOAD, pml.UPDN_STATE_REQSTART)
  195.                 continue
  196.             if state == STATE_WAIT_FOR_ACTIVE:
  197.                 state = STATE_UPLOAD_DATA
  198.                 tries = 0
  199.                 while True:
  200.                     tries += 1
  201.                     ul_state = self.getCfgUploadState()
  202.                     if ul_state == pml.UPDN_STATE_XFERACTIVE:
  203.                         break
  204.                     
  205.                     if ul_state in (pml.UPDN_STATE_ERRORABORT, pml.UPDN_STATE_XFERDONE):
  206.                         log.error('Cfg upload aborted!')
  207.                         state = STATE_ERROR
  208.                         break
  209.                     
  210.                     if tries > 10:
  211.                         state = STATE_ERROR
  212.                         log.error('Unable to get into active state!')
  213.                         break
  214.                     
  215.                     time.sleep(0.5)
  216.                 continue
  217.             if state == STATE_UPLOAD_DATA:
  218.                 continue
  219.             if state == STATE_DEVICE_CLOSE:
  220.                 self.dev.close()
  221.                 continue
  222.  
  223.  
  224.  
  225. class PMLFaxSendThread(FaxSendThread):
  226.     
  227.     def __init__(self, dev, service, phone_num_list, fax_file_list, cover_message = '', cover_re = '', cover_func = None, preserve_formatting = False, printer_name = '', update_queue = None, event_queue = None):
  228.         FaxSendThread.__init__(self, dev, service, phone_num_list, fax_file_list, cover_message, cover_re, cover_func, preserve_formatting, printer_name, update_queue, event_queue)
  229.  
  230.     
  231.     def run(self):
  232.         STATE_DONE = 0
  233.         STATE_ABORTED = 10
  234.         STATE_SUCCESS = 20
  235.         STATE_BUSY = 25
  236.         STATE_READ_SENDER_INFO = 30
  237.         STATE_PRERENDER = 40
  238.         STATE_COUNT_PAGES = 50
  239.         STATE_NEXT_RECIPIENT = 60
  240.         STATE_COVER_PAGE = 70
  241.         STATE_SINGLE_FILE = 80
  242.         STATE_MERGE_FILES = 90
  243.         STATE_SINGLE_FILE = 100
  244.         STATE_SEND_FAX = 110
  245.         STATE_CLEANUP = 120
  246.         STATE_ERROR = 130
  247.         next_recipient = self.next_recipient_gen()
  248.         state = STATE_READ_SENDER_INFO
  249.         self.rendered_file_list = []
  250.         while state != STATE_DONE:
  251.             if self.check_for_cancel():
  252.                 state = STATE_ABORTED
  253.             
  254.             log.debug('STATE=(%d, 0, 0)' % state)
  255.             if state == STATE_ABORTED:
  256.                 log.error('Aborted by user.')
  257.                 self.write_queue((STATUS_IDLE, 0, ''))
  258.                 state = STATE_CLEANUP
  259.                 continue
  260.             if state == STATE_SUCCESS:
  261.                 log.debug('Success.')
  262.                 self.write_queue((STATUS_COMPLETED, 0, ''))
  263.                 state = STATE_CLEANUP
  264.                 continue
  265.             if state == STATE_ERROR:
  266.                 log.error('Error, aborting.')
  267.                 self.write_queue((STATUS_ERROR, 0, ''))
  268.                 state = STATE_CLEANUP
  269.                 continue
  270.             if state == STATE_BUSY:
  271.                 log.error('Device busy, aborting.')
  272.                 self.write_queue((STATUS_BUSY, 0, ''))
  273.                 state = STATE_CLEANUP
  274.                 continue
  275.             if state == STATE_READ_SENDER_INFO:
  276.                 log.debug('%s State: Get sender info' % '********************')
  277.                 state = STATE_PRERENDER
  278.                 
  279.                 try:
  280.                     self.dev.open()
  281.                 except Error:
  282.                     e = None
  283.                     log.error('Unable to open device (%s).' % e.msg)
  284.                     state = STATE_ERROR
  285.                 else:
  286.                     
  287.                     try:
  288.                         self.sender_name = self.dev.station_name
  289.                         log.debug('Sender name=%s' % self.sender_name)
  290.                         self.sender_fax = self.dev.phone_num
  291.                         log.debug('Sender fax=%s' % self.sender_fax)
  292.                     except Error:
  293.                         log.error('PML get failed!')
  294.                         state = STATE_ERROR
  295.  
  296.                 finally:
  297.                     self.dev.close()
  298.  
  299.                 continue
  300.             if state == STATE_PRERENDER:
  301.                 log.debug('%s State: Pre-render non-G3 files' % '********************')
  302.                 state = self.pre_render(STATE_COUNT_PAGES)
  303.                 continue
  304.             if state == STATE_COUNT_PAGES:
  305.                 log.debug('%s State: Get total page count' % '********************')
  306.                 state = self.count_pages(STATE_NEXT_RECIPIENT)
  307.                 continue
  308.             if state == STATE_NEXT_RECIPIENT:
  309.                 log.debug('%s State: Next recipient' % '********************')
  310.                 state = STATE_COVER_PAGE
  311.                 
  312.                 try:
  313.                     recipient = next_recipient.next()
  314.                     log.debug('Processing for recipient %s' % recipient['name'])
  315.                     self.write_queue((STATUS_SENDING_TO_RECIPIENT, 0, recipient['name']))
  316.                 except StopIteration:
  317.                     state = STATE_SUCCESS
  318.                     log.debug('Last recipient.')
  319.                     continue
  320.  
  321.                 self.recipient_file_list = self.rendered_file_list[:]
  322.                 continue
  323.             if state == STATE_COVER_PAGE:
  324.                 log.debug('%s State: Render cover page' % '********************')
  325.                 state = self.cover_page(recipient)
  326.                 continue
  327.             if state == STATE_SINGLE_FILE:
  328.                 log.debug('%s State: Handle single file' % '********************')
  329.                 state = self.single_file(STATE_SEND_FAX)
  330.                 continue
  331.             if state == STATE_MERGE_FILES:
  332.                 log.debug('%s State: Merge multiple files' % '********************')
  333.                 state = self.merge_files(STATE_SEND_FAX)
  334.                 continue
  335.             if state == STATE_SEND_FAX:
  336.                 log.debug('%s State: Send fax' % '********************')
  337.                 state = STATE_NEXT_RECIPIENT
  338.                 FAX_SEND_STATE_DONE = 0
  339.                 FAX_SEND_STATE_ABORT = 10
  340.                 FAX_SEND_STATE_ERROR = 20
  341.                 FAX_SEND_STATE_BUSY = 25
  342.                 FAX_SEND_STATE_SUCCESS = 30
  343.                 FAX_SEND_STATE_DEVICE_OPEN = 40
  344.                 FAX_SEND_STATE_SET_TOKEN = 50
  345.                 FAX_SEND_STATE_EARLY_OPEN = 60
  346.                 FAX_SEND_STATE_SET_PARAMS = 70
  347.                 FAX_SEND_STATE_CHECK_IDLE = 80
  348.                 FAX_SEND_STATE_START_REQUEST = 90
  349.                 FAX_SEND_STATE_LATE_OPEN = 100
  350.                 FAX_SEND_STATE_SEND_DIAL_STRINGS = 110
  351.                 FAX_SEND_STATE_SEND_FAX_HEADER = 120
  352.                 FAX_SEND_STATE_SEND_PAGES = 130
  353.                 FAX_SEND_STATE_SEND_END_OF_STREAM = 140
  354.                 FAX_SEND_STATE_WAIT_FOR_COMPLETE = 150
  355.                 FAX_SEND_STATE_RESET_TOKEN = 160
  356.                 FAX_SEND_STATE_CLOSE_SESSION = 170
  357.                 monitor_state = False
  358.                 error_state = pml.DN_ERROR_NONE
  359.                 fax_send_state = FAX_SEND_STATE_DEVICE_OPEN
  360.                 while fax_send_state != FAX_SEND_STATE_DONE:
  361.                     if self.check_for_cancel():
  362.                         log.error('Fax send aborted.')
  363.                         fax_send_state = FAX_SEND_STATE_ABORT
  364.                     
  365.                     if monitor_state:
  366.                         fax_state = self.getFaxDownloadState()
  367.                         if fax_state not in (pml.UPDN_STATE_XFERACTIVE, pml.UPDN_STATE_XFERDONE):
  368.                             log.error('D/L error state=%d' % fax_state)
  369.                             fax_send_state = FAX_SEND_STATE_ERROR
  370.                             state = STATE_ERROR
  371.                         
  372.                     
  373.                     log.debug('STATE=(%d, %d, 0)' % (STATE_SEND_FAX, fax_send_state))
  374.                     if fax_send_state == FAX_SEND_STATE_ABORT:
  375.                         monitor_state = False
  376.                         fax_send_state = FAX_SEND_STATE_RESET_TOKEN
  377.                         state = STATE_ABORTED
  378.                         continue
  379.                     if fax_send_state == FAX_SEND_STATE_ERROR:
  380.                         log.error('Fax send error.')
  381.                         error_state = self.getFaxDownloadError()
  382.                         log.debug('Error State=%d (%s)' % (error_state, pml.DN_ERROR_STR.get(error_state, 'Unknown')))
  383.                         monitor_state = False
  384.                         fax_send_state = FAX_SEND_STATE_RESET_TOKEN
  385.                         state = STATE_ERROR
  386.                         continue
  387.                     if fax_send_state == FAX_SEND_STATE_BUSY:
  388.                         log.error('Fax device busy.')
  389.                         monitor_state = False
  390.                         fax_send_state = FAX_SEND_STATE_RESET_TOKEN
  391.                         state = STATE_BUSY
  392.                         continue
  393.                     if fax_send_state == FAX_SEND_STATE_SUCCESS:
  394.                         log.debug('Fax send success.')
  395.                         monitor_state = False
  396.                         fax_send_state = FAX_SEND_STATE_RESET_TOKEN
  397.                         state = STATE_NEXT_RECIPIENT
  398.                         continue
  399.                     if fax_send_state == FAX_SEND_STATE_DEVICE_OPEN:
  400.                         log.debug('%s State: Open device' % '********************')
  401.                         fax_send_state = FAX_SEND_STATE_SET_TOKEN
  402.                         
  403.                         try:
  404.                             self.dev.open()
  405.                         except Error:
  406.                             e = None
  407.                             log.error('Unable to open device (%s).' % e.msg)
  408.                             fax_send_state = FAX_SEND_STATE_ERROR
  409.  
  410.                         if self.dev.device_state == DEVICE_STATE_NOT_FOUND:
  411.                             fax_send_state = FAX_SEND_STATE_ERROR
  412.                         
  413.                     self.dev.device_state == DEVICE_STATE_NOT_FOUND
  414.                     if fax_send_state == FAX_SEND_STATE_SET_TOKEN:
  415.                         log.debug('%s State: Acquire fax token' % '********************')
  416.                         
  417.                         try:
  418.                             (result_code, token) = self.dev.getPML(pml.OID_FAX_TOKEN)
  419.                         except Error:
  420.                             log.debug('Unable to acquire fax token (1).')
  421.                             fax_send_state = FAX_SEND_STATE_EARLY_OPEN
  422.  
  423.                     None if result_code > pml.ERROR_MAX_OK else check_token == token
  424.                     if fax_send_state == FAX_SEND_STATE_EARLY_OPEN:
  425.                         log.debug('%s State: Early open' % '********************')
  426.                         fax_send_state = FAX_SEND_STATE_CHECK_IDLE
  427.                         if self.dev.fax_type == FAX_TYPE_BLACK_SEND_EARLY_OPEN:
  428.                             log.debug('Opening fax channel.')
  429.                             
  430.                             try:
  431.                                 self.dev.openFax()
  432.                             except Error:
  433.                                 e = None
  434.                                 log.error('Unable to open channel (%s).' % e.msg)
  435.                                 fax_send_state = FAX_SEND_STATE_ERROR
  436.                             except:
  437.                                 None<EXCEPTION MATCH>Error
  438.                             
  439.  
  440.                         None<EXCEPTION MATCH>Error
  441.                         log.debug('Skipped.')
  442.                         continue
  443.                     if fax_send_state == FAX_SEND_STATE_CHECK_IDLE:
  444.                         log.debug('%s State: Check idle' % '********************')
  445.                         fax_send_state = FAX_SEND_STATE_START_REQUEST
  446.                         dl_state = self.getFaxDownloadState()
  447.                         tx_status = self.getFaxJobTxStatus()
  448.                         rx_status = self.getFaxJobRxStatus()
  449.                         if dl_state == pml.UPDN_STATE_IDLE and dl_state == pml.UPDN_STATE_ERRORABORT or dl_state == pml.UPDN_STATE_XFERDONE:
  450.                             if tx_status == pml.FAXJOB_TX_STATUS_IDLE or tx_status == pml.FAXJOB_TX_STATUS_DONE:
  451.                                 pass
  452.                         None if rx_status == pml.FAXJOB_RX_STATUS_IDLE or rx_status == pml.FAXJOB_RX_STATUS_DONE else dl_state == pml.UPDN_STATE_IDLE
  453.                         fax_send_state = FAX_SEND_STATE_BUSY
  454.                         continue
  455.                     if fax_send_state == FAX_SEND_STATE_START_REQUEST:
  456.                         log.debug('%s State: Request start' % '********************')
  457.                         fax_send_state = FAX_SEND_STATE_SET_PARAMS
  458.                         dl_state = self.getFaxDownloadState()
  459.                         if dl_state == pml.UPDN_STATE_IDLE:
  460.                             log.debug('Try: 0')
  461.                             log.debug('Setting to up/down state request start...')
  462.                             self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_REQSTART)
  463.                             time.sleep(1)
  464.                             log.debug('Waiting for active state...')
  465.                             i = 1
  466.                             while i < 10:
  467.                                 log.debug('Try: %d' % i)
  468.                                 
  469.                                 try:
  470.                                     dl_state = self.getFaxDownloadState()
  471.                                 except Error:
  472.                                     log.error('PML/SNMP error')
  473.                                     fax_send_state = FAX_SEND_STATE_ERROR
  474.                                     break
  475.  
  476.                                 if dl_state == pml.UPDN_STATE_XFERACTIVE:
  477.                                     break
  478.                                 
  479.                                 time.sleep(1)
  480.                                 log.debug('Setting to up/down state request start...')
  481.                                 self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_REQSTART)
  482.                                 i += 1
  483.                             log.error('Could not get into active state!')
  484.                             fax_send_state = FAX_SEND_STATE_BUSY
  485.                             monitor_state = True
  486.                         else:
  487.                             log.error('Could not get into idle state!')
  488.                             fax_send_state = FAX_SEND_STATE_BUSY
  489.                     dl_state == pml.UPDN_STATE_IDLE
  490.                     if fax_send_state == FAX_SEND_STATE_SET_PARAMS:
  491.                         log.debug('%s State: Set params' % '********************')
  492.                         fax_send_state = FAX_SEND_STATE_LATE_OPEN
  493.                         
  494.                         try:
  495.                             self.dev.setPML(pml.OID_DEV_DOWNLOAD_TIMEOUT, pml.DEFAULT_DOWNLOAD_TIMEOUT)
  496.                             self.dev.setPML(pml.OID_FAXJOB_TX_TYPE, pml.FAXJOB_TX_TYPE_HOST_ONLY)
  497.                             log.debug('Setting date and time on device.')
  498.                             self.dev.setDateAndTime()
  499.                         except Error:
  500.                             e = None
  501.                             log.error('PML/SNMP error (%s)' % e.msg)
  502.                             fax_send_state = FAX_SEND_STATE_ERROR
  503.                         except:
  504.                             None<EXCEPTION MATCH>Error
  505.                         
  506.  
  507.                     None<EXCEPTION MATCH>Error
  508.                     if fax_send_state == FAX_SEND_STATE_LATE_OPEN:
  509.                         log.debug('%s State: Late open' % '********************')
  510.                         fax_send_state = FAX_SEND_STATE_SEND_DIAL_STRINGS
  511.                         if self.dev.fax_type == FAX_TYPE_BLACK_SEND_LATE_OPEN:
  512.                             log.debug('Opening fax channel.')
  513.                             
  514.                             try:
  515.                                 self.dev.openFax()
  516.                             except Error:
  517.                                 log.error('Unable to open channel.')
  518.                                 fax_send_state = FAX_SEND_STATE_ERROR
  519.                             except:
  520.                                 None<EXCEPTION MATCH>Error
  521.                             
  522.  
  523.                         None<EXCEPTION MATCH>Error
  524.                         log.debug('Skipped.')
  525.                         continue
  526.                     if fax_send_state == FAX_SEND_STATE_SEND_DIAL_STRINGS:
  527.                         log.debug('%s State: Send dial strings' % '********************')
  528.                         fax_send_state = FAX_SEND_STATE_SEND_FAX_HEADER
  529.                         log.debug('Dialing: %s' % recipient['fax'])
  530.                         log.debug('Sending dial strings...')
  531.                         self.create_mfpdtf_fixed_header(DT_DIAL_STRINGS, True, PAGE_FLAG_NEW_DOC | PAGE_FLAG_END_DOC | PAGE_FLAG_END_STREAM)
  532.                         dial_strings = recipient['fax'].encode('ascii')
  533.                         log.debug(repr(dial_strings))
  534.                         self.create_mfpdtf_dial_strings(dial_strings)
  535.                         
  536.                         try:
  537.                             self.write_stream()
  538.                         except Error:
  539.                             log.error('Channel write error.')
  540.                             fax_send_state = FAX_SEND_STATE_ERROR
  541.                         except:
  542.                             None<EXCEPTION MATCH>Error
  543.                         
  544.  
  545.                     None<EXCEPTION MATCH>Error
  546.                     if fax_send_state == FAX_SEND_STATE_SEND_FAX_HEADER:
  547.                         log.debug('%s State: Send fax header' % '********************')
  548.                         fax_send_state = FAX_SEND_STATE_SEND_PAGES
  549.                         
  550.                         try:
  551.                             ff = file(self.f, 'r')
  552.                         except IOError:
  553.                             log.error('Unable to read fax file.')
  554.                             fax_send_state = FAX_SEND_STATE_ERROR
  555.                             continue
  556.  
  557.                         
  558.                         try:
  559.                             header = ff.read(FILE_HEADER_SIZE)
  560.                         except IOError:
  561.                             log.error('Unable to read fax file.')
  562.                             fax_send_state = FAX_SEND_STATE_ERROR
  563.                             continue
  564.  
  565.                         (magic, version, total_pages, hort_dpi, vert_dpi, page_size, resolution, encoding, reserved1, reserved2) = self.decode_fax_header(header)
  566.                     None if magic != 'hplip_g3' else None<EXCEPTION MATCH>Error
  567.                     if fax_send_state == FAX_SEND_STATE_SEND_PAGES:
  568.                         log.debug('%s State: Send pages' % '********************')
  569.                         fax_send_state = FAX_SEND_STATE_SEND_END_OF_STREAM
  570.                         page = StringIO()
  571.                         for p in range(total_pages):
  572.                             if self.check_for_cancel():
  573.                                 fax_send_state = FAX_SEND_STATE_ABORT
  574.                             
  575.                             if fax_send_state == FAX_SEND_STATE_ABORT:
  576.                                 break
  577.                             
  578.                             
  579.                             try:
  580.                                 header = ff.read(PAGE_HEADER_SIZE)
  581.                             except IOError:
  582.                                 log.error('Unable to read fax file.')
  583.                                 fax_send_state = FAX_SEND_STATE_ERROR
  584.                                 continue
  585.  
  586.                             (page_num, ppr, rpp, bytes_to_read, thumbnail_bytes, reserved2) = self.decode_page_header(header)
  587.                             log.debug('Page=%d PPR=%d RPP=%d BPP=%d Thumb=%d' % (page_num, ppr, rpp, bytes_to_read, thumbnail_bytes))
  588.                             page.write(ff.read(bytes_to_read))
  589.                             thumbnail = ff.read(thumbnail_bytes)
  590.                             page.seek(0)
  591.                             self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, page_flags = PAGE_FLAG_NEW_PAGE)
  592.                             self.create_sop_record(page_num, hort_dpi, vert_dpi, ppr, rpp, encoding)
  593.                             
  594.                             try:
  595.                                 data = page.read(RASTER_DATA_SIZE)
  596.                             except IOError:
  597.                                 log.error('Unable to read fax file.')
  598.                                 fax_send_state = FAX_SEND_STATE_ERROR
  599.                                 continue
  600.  
  601.                             if data == '':
  602.                                 log.error('No data!')
  603.                                 fax_send_state = FAX_SEND_STATE_ERROR
  604.                                 continue
  605.                             
  606.                             self.create_raster_data_record(data)
  607.                             total_read = RASTER_DATA_SIZE
  608.                             while True:
  609.                                 data = page.read(RASTER_DATA_SIZE)
  610.                                 total_read += RASTER_DATA_SIZE
  611.                                 self.getFaxDownloadState()
  612.                                 if data == '':
  613.                                     self.create_eop_record(rpp)
  614.                                     
  615.                                     try:
  616.                                         self.write_stream()
  617.                                     except Error:
  618.                                         log.error('Channel write error.')
  619.                                         fax_send_state = FAX_SEND_STATE_ERROR
  620.  
  621.                                     break
  622.                                 else:
  623.                                     
  624.                                     try:
  625.                                         self.write_stream()
  626.                                     except Error:
  627.                                         log.error('Channel write error.')
  628.                                         fax_send_state = FAX_SEND_STATE_ERROR
  629.                                         break
  630.  
  631.                                 status = self.getFaxJobTxStatus()
  632.                                 while status == pml.FAXJOB_TX_STATUS_DIALING:
  633.                                     self.write_queue((STATUS_DIALING, 0, recipient['fax']))
  634.                                     time.sleep(1)
  635.                                     if self.check_for_cancel():
  636.                                         fax_send_state = FAX_SEND_STATE_ABORT
  637.                                         break
  638.                                     
  639.                                     dl_state = self.getFaxDownloadState()
  640.                                     if dl_state == pml.UPDN_STATE_ERRORABORT:
  641.                                         fax_send_state = FAX_SEND_STATE_ERROR
  642.                                         break
  643.                                     
  644.                                     status = self.getFaxJobTxStatus()
  645.                                 if fax_send_state not in (FAX_SEND_STATE_ABORT, FAX_SEND_STATE_ERROR):
  646.                                     while status == pml.FAXJOB_TX_STATUS_CONNECTING:
  647.                                         self.write_queue((STATUS_CONNECTING, 0, recipient['fax']))
  648.                                         time.sleep(1)
  649.                                         if self.check_for_cancel():
  650.                                             fax_send_state = FAX_SEND_STATE_ABORT
  651.                                             break
  652.                                         
  653.                                         dl_state = self.getFaxDownloadState()
  654.                                         if dl_state == pml.UPDN_STATE_ERRORABORT:
  655.                                             fax_send_state = FAX_SEND_STATE_ERROR
  656.                                             break
  657.                                         
  658.                                         status = self.getFaxJobTxStatus()
  659.                                 
  660.                                 if status == pml.FAXJOB_TX_STATUS_TRANSMITTING:
  661.                                     self.write_queue((STATUS_SENDING, page_num, recipient['fax']))
  662.                                 
  663.                                 self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, page_flags = 0)
  664.                                 self.create_raster_data_record(data)
  665.                                 if fax_send_state in (FAX_SEND_STATE_ABORT, FAX_SEND_STATE_ERROR):
  666.                                     break
  667.                                     continue
  668.                             page.truncate(0)
  669.                             page.seek(0)
  670.                         
  671.                     if fax_send_state == FAX_SEND_STATE_SEND_END_OF_STREAM:
  672.                         log.debug('%s State: Send EOS' % '********************')
  673.                         fax_send_state = FAX_SEND_STATE_WAIT_FOR_COMPLETE
  674.                         log.debug('End of stream...')
  675.                         self.create_mfpdtf_fixed_header(DT_FAX_IMAGES, False, PAGE_FLAG_END_STREAM)
  676.                         
  677.                         try:
  678.                             self.write_stream()
  679.                         except Error:
  680.                             log.error('Channel write error.')
  681.                             fax_send_state = FAX_SEND_STATE_ERROR
  682.  
  683.                         monitor_state = False
  684.                         continue
  685.                     if fax_send_state == FAX_SEND_STATE_WAIT_FOR_COMPLETE:
  686.                         log.debug('%s State: Wait for completion' % '********************')
  687.                         fax_send_state = FAX_SEND_STATE_WAIT_FOR_COMPLETE
  688.                         time.sleep(1)
  689.                         status = self.getFaxJobTxStatus()
  690.                         if status == pml.FAXJOB_TX_STATUS_DIALING:
  691.                             self.write_queue((STATUS_DIALING, 0, recipient['fax']))
  692.                             log.debug('Dialing ...')
  693.                         elif status == pml.FAXJOB_TX_STATUS_TRANSMITTING:
  694.                             self.write_queue((STATUS_SENDING, page_num, recipient['fax']))
  695.                             log.debug('Transmitting ...')
  696.                         elif status in (pml.FAXJOB_TX_STATUS_DONE, pml.FAXJOB_RX_STATUS_IDLE):
  697.                             fax_send_state = FAX_SEND_STATE_RESET_TOKEN
  698.                             state = STATE_NEXT_RECIPIENT
  699.                             log.debug('Transmitting done or idle ...')
  700.                         else:
  701.                             self.write_queue((STATUS_SENDING, page_num, recipient['fax']))
  702.                             log.debug('Pending ...')
  703.                     status == pml.FAXJOB_TX_STATUS_DIALING
  704.                     if fax_send_state == FAX_SEND_STATE_RESET_TOKEN:
  705.                         self.write_queue((STATUS_CLEANUP, 0, ''))
  706.                         log.debug('%s State: Release fax token' % '********************')
  707.                         
  708.                         try:
  709.                             self.dev.setPML(pml.OID_FAX_TOKEN, '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
  710.                         except Error:
  711.                             log.error('Unable to release fax token.')
  712.  
  713.                         fax_send_state = FAX_SEND_STATE_CLOSE_SESSION
  714.                         continue
  715.                     if fax_send_state == FAX_SEND_STATE_CLOSE_SESSION:
  716.                         log.debug('%s State: Close session' % '********************')
  717.                         fax_send_state = FAX_SEND_STATE_DONE
  718.                         log.debug('Closing session...')
  719.                         
  720.                         try:
  721.                             mm.close()
  722.                         except NameError:
  723.                             pass
  724.  
  725.                         
  726.                         try:
  727.                             ff.close()
  728.                         except NameError:
  729.                             pass
  730.  
  731.                         if self.dev.fax_type == FAX_TYPE_BLACK_SEND_LATE_OPEN:
  732.                             log.debug('Closing fax channel.')
  733.                             self.dev.closeFax()
  734.                         
  735.                         self.dev.setPML(pml.OID_FAX_DOWNLOAD, pml.UPDN_STATE_IDLE)
  736.                         time.sleep(1)
  737.                         if self.dev.fax_type == FAX_TYPE_BLACK_SEND_EARLY_OPEN:
  738.                             log.debug('Closing fax channel.')
  739.                             self.dev.closeFax()
  740.                         
  741.                         self.dev.close()
  742.                         continue
  743.                 continue
  744.             if state == STATE_CLEANUP:
  745.                 log.debug('%s State: Cleanup' % '********************')
  746.                 if self.remove_temp_file:
  747.                     log.debug('Removing merged file: %s' % self.f)
  748.                     
  749.                     try:
  750.                         os.remove(self.f)
  751.                         log.debug('Removed')
  752.                     except OSError:
  753.                         log.debug('Not found')
  754.                     except:
  755.                         None<EXCEPTION MATCH>OSError
  756.                     
  757.  
  758.                 None<EXCEPTION MATCH>OSError
  759.                 state = STATE_DONE
  760.                 continue
  761.  
  762.     
  763.     def getFaxDownloadState(self):
  764.         (result_code, state) = self.dev.getPML(pml.OID_FAX_DOWNLOAD)
  765.         if state:
  766.             log.debug('D/L State=%d (%s)' % (state, pml.UPDN_STATE_STR.get(state, 'Unknown')))
  767.             return state
  768.         return pml.UPDN_STATE_ERRORABORT
  769.  
  770.     
  771.     def getFaxDownloadError(self):
  772.         (result_code, state) = self.dev.getPML(pml.OID_FAX_DOWNLOAD_ERROR)
  773.         if state:
  774.             return state
  775.         return pml.DN_ERROR_UNKNOWN
  776.  
  777.     
  778.     def getFaxJobTxStatus(self):
  779.         (result_code, status) = self.dev.getPML(pml.OID_FAXJOB_TX_STATUS)
  780.         if status:
  781.             log.debug('Tx Status=%d (%s)' % (status, pml.FAXJOB_TX_STATUS_STR.get(status, 'Unknown')))
  782.             return status
  783.         return pml.FAXJOB_TX_STATUS_IDLE
  784.  
  785.     
  786.     def getFaxJobRxStatus(self):
  787.         (result_code, status) = self.dev.getPML(pml.OID_FAXJOB_RX_STATUS)
  788.         if status:
  789.             log.debug('Rx Status=%d (%s)' % (status, pml.FAXJOB_RX_STATUS_STR.get(status, 'Unknown')))
  790.             return status
  791.         return pml.FAXJOB_RX_STATUS_IDLE
  792.  
  793.     
  794.     def getCfgUploadState(self):
  795.         (result_code, state) = self.dev.getPML(pml.OID_DEVICE_CFG_UPLOAD)
  796.         if state:
  797.             log.debug('Cfg Upload State = %d (%s)' % (state, pml.UPDN_STATE_STR.get(state, 'Unknown')))
  798.             return state
  799.         return pml.UPDN_STATE_ERRORABORT
  800.  
  801.     
  802.     def create_mfpdtf_fixed_header(self, data_type, send_variant = False, page_flags = 0):
  803.         header_len = FIXED_HEADER_SIZE
  804.         if send_variant:
  805.             if data_type == DT_DIAL_STRINGS:
  806.                 header_len += DIAL_STRINGS_VARIANT_HEADER_SIZE
  807.             elif data_type == DT_FAX_IMAGES:
  808.                 header_len += FAX_IMAGE_VARIANT_HEADER_SIZE
  809.             
  810.         
  811.         self.stream.write(struct.pack('<IHBB', 0, header_len, data_type, page_flags))
  812.  
  813.     
  814.     def create_mfpdtf_dial_strings(self, number):
  815.         p = struct.pack('<BBHH51s', MAJOR_VER, MINOR_VER, 1, 51, number[:51])
  816.         log.debug(repr(p))
  817.         self.stream.write(p)
  818.  
  819.     
  820.     def adjust_fixed_header_block_size(self):
  821.         size = self.stream.tell()
  822.         self.stream.seek(0)
  823.         self.stream.write(struct.pack('<I', size))
  824.  
  825.     
  826.     def create_sop_record(self, page_num, hort_dpi, vert_dpi, ppr, rpp, encoding, bpp = 1):
  827.         self.stream.write(struct.pack('<BBHHHIHHHHHHIHHHH', RT_START_PAGE, encoding, page_num, ppr, bpp, rpp, 0, hort_dpi, 0, vert_dpi, ppr, bpp, rpp, 0, hort_dpi, 0, vert_dpi))
  828.  
  829.     
  830.     def create_eop_record(self, rpp):
  831.         self.stream.write(struct.pack('<BBBBII', RT_END_PAGE, 0, 0, 0, rpp, 0))
  832.  
  833.     
  834.     def create_raster_data_record(self, data):
  835.         if not len(data) <= RASTER_DATA_SIZE:
  836.             raise AssertionError
  837.         self.stream.write(struct.pack('<BBH', RT_RASTER, 0, len(data)))
  838.         self.stream.write(data)
  839.  
  840.     
  841.     def create_mfpdtf_fax_header(self, total_pages):
  842.         self.stream.write(struct.pack('<BBBHBI20s20s20sI', MAJOR_VER, MINOR_VER, SRC_HOST, total_pages, TTI_PREPENDED_TO_IMAGE, 0, '', '', '', 0))
  843.  
  844.     
  845.     def write_stream(self):
  846.         self.adjust_fixed_header_block_size()
  847.         self.dev.writeFax(self.stream.getvalue())
  848.         self.stream.truncate(0)
  849.         self.stream.seek(0)
  850.  
  851.  
  852.